class DateUtils {
  /**
   * 获取当前日期时间
   * @returns {Date} 当前日期时间
   */
  static now(): Date {
    return new Date()
  }

  /**
   * 格式化时间
   * @param {Date} date 需要格式化的日期对象
   * @param {string} format 需要的格式，如 'YYYY-MM-DD HH:mm:ss'
   * @returns {string} 格式化后的时间字符串
   */
  static formatDate(date: Date, format: string): string {
    const options: { [key: string]: string } = {
      YYYY: String(date.getFullYear()),
      MM: String(date.getMonth() + 1).padStart(2, '0'), // 月份从0开始
      DD: String(date.getDate()).padStart(2, '0'),
      HH: String(date.getHours()).padStart(2, '0'),
      mm: String(date.getMinutes()).padStart(2, '0'),
      ss: String(date.getSeconds()).padStart(2, '0'),
    }

    return format.replace(/YYYY|MM|DD|HH|mm|ss/g, (match) => {
      return options[match] || match
    })
  }

  /**
   * 获取当前时间的格式化结果
   * @param {string} format 需要的格式，默认 'YYYY-MM-DD HH:mm:ss'
   * @returns {string} 当前时间的格式化字符串
   */
  static getFormattedTime(format: string = 'YYYY-MM-DD HH:mm:ss'): string {
    const currentTime = this.now()
    return this.formatDate(currentTime, format)
  }

  /**
   * 获取指定时间的格式化结果
   * @param {Date} date 需要格式化的日期对象
   * @param {string} format 需要的格式，默认 'YYYY-MM-DD HH:mm:ss'
   * @returns {string} 指定时间的格式化字符串
   */
  static getFormattedTimeFromDate(date: Date, format: string = 'YYYY-MM-DD HH:mm:ss'): string {
    return this.formatDate(date, format)
  }

  /**
   * 计算两个日期之间的天数差
   * @param {Date} date1 - 第一个日期
   * @param {Date} date2 - 第二个日期
   * @returns {number} 天数差
   */
  static daysBetween(date1: Date, date2: Date): number {
    const timeDiff: number = Math.abs(date2.getTime() - date1.getTime())
    return Math.ceil(timeDiff / (1000 * 60 * 60 * 24))
  }

  /**
   * 将字符串解析为日期
   * @param {string} dateStr - 日期字符串
   * @returns {Date} 解析后的日期对象
   */
  static parse(dateStr: string): Date {
    return new Date(dateStr)
  }

  /**
   * 获取当前时间戳
   * @returns {number} 当前时间戳
   */
  static timestamp(): number {
    return Math.floor(Date.now() / 1000)
  }
}

export default DateUtils
